/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dominio.usuarios;

import dominio.investimentos.Acao;
import dominio.investimentos.Carteira;
import dominio.investimentos.Operacao;
import java.util.ArrayList;
import java.util.Calendar;

/**
 *
 * @author Daniel
 */
public class Usuario {

    private String nome;
    private Calendar dNasc;
    private String sexo;
    private String endereco;
    private float saldo;
    private Carteira carteira;
    private String login;
    private String senha;
    private ArrayList<Operacao> operacoes;

    public Usuario() {
    }

    public Usuario(String nome, Calendar dNasc, String sexo, String endereco, float saldo, String login, String senha) {
        this.nome = nome;
        this.dNasc = dNasc;
        this.sexo = sexo;
        this.endereco = endereco;
        this.saldo = saldo;
        this.login = login;
        this.senha = senha;
    }

    public Calendar getdNasc() {
        return dNasc;
    }

    public void setdNasc(Calendar dNasc) {
        this.dNasc = dNasc;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public float getSaldo() {
        return saldo;
    }

    public void setSaldo(float saldo) {
        this.saldo = saldo;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    public Carteira getCarteira() {
        return carteira;
    }

    public void setCarteira(Carteira carteira) {
        this.carteira = carteira;
    }

    public ArrayList<Operacao> getOperacoes() {
        return operacoes;
    }

    public void setOperacoes(ArrayList<Operacao> operacoes) {
        this.operacoes = operacoes;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }


    /*
     * Método que realiza a operacao de compra selecionada de acordo com a ação da bolsa 
     * a ser comprada e a quantidade.
     */
    public void realizarOperacao(Operacao operacao, int index, Acao acao) {

        //Checa se o usuário possui a ação que está comprando em sua carteira
        if (acharAcaoPorNome(carteira.getAcoesPossuidas(), acao.getNome())) {
            //Caso tenha, simplesmente atualiza a quantidade.
            this.carteira.getAcoesPossuidas().get(index).setQtd(operacao.calcularNovaQtd(this.carteira.getAcoesPossuidas().get(index).getQtd()));
        } else {
            //Caso não tenha, insere uma nova Ação em sua carteira com os dados da ação comprada
            //e a quantidade dessas ações que ele comrpou.
            Acao acaoNova = new Acao(acao.getValorAtual(), acao.getValorMax(), acao.getValorMin(), acao.getVariacao(), acao.getMedia(), acao.getAbertura(), acao.getNome());
            acaoNova.setQtd(operacao.getQtd());
            carteira.getAcoesPossuidas().add(acaoNova);
        }
        //Atualiza o saldo e insere a operação em sua lista de operações.
        this.saldo -= operacao.getValorTotal();
        this.operacoes.add(operacao);
    }

    /*
     * Método que realiza a operacao de venda selecionada de acordo com a ação a ser vendida
     * e a quantidade.
     */
    public void realizarOperacao(Operacao operacao, int index) {
        //Atualiza a quantidade de ações do tipo de ação vendida.
        this.carteira.getAcoesPossuidas().get(index).setQtd(operacao.calcularNovaQtd(this.carteira.getAcoesPossuidas().get(index).getQtd()));
        //Caso tenha vendido todas as ações, remove essa ação de sua lista de ações possuidas.
        if (this.carteira.getAcoesPossuidas().get(index).getQtd() == 0) {
            this.getCarteira().getAcoesPossuidas().remove(index);
        }
        //Atualiza o saldo e insere a operação em sua lista de operações.
        this.saldo += operacao.getValorTotal();
        this.operacoes.add(operacao);
    }

    /*
     * Método que instancia os atributos Carteira (com seu array de ações) e array de operacoes.
     * Posto aqui de acordo com o padrão Criador.
     */
    public void criarAtributos() {
        this.carteira = new Carteira();
        this.carteira.setAcoesPossuidas(new ArrayList<Acao>());
        this.operacoes = new ArrayList<Operacao>();
    }

    /*
     * Método que checa se dentro de uma lista de ações existe uma ação com o 
     * nome passado como parametro.
     */
    public boolean acharAcaoPorNome(ArrayList<Acao> listaAcao, String nome) {
        boolean achou = false;
        int i;
       
        for (i = 0; i < listaAcao.size(); i++){
            if (nome.equalsIgnoreCase(listaAcao.get(i).getNome())) {
                achou = true;
            }            
        }
        return achou;
    }
}
